package microframe.navigation.abs
{
	import com.ux.base.BUrlLoader;
	import com.ux.util.StringUtils;
	
	import flash.display.MovieClip;
	import flash.utils.Dictionary;
	
	import microframe.event.EventType;
	import microframe.event.MicroEvent;
	import microframe.event.MicroEventObserver;
	import microframe.manager.ContentsTypeManager;
	import microframe.manager.ContentsTypeManager;
	import microframe.manager.URLManager;
	import microframe.navigation.interfaces.INaviLayout;
	import microframe.navigation.model.BtnVO;
	
	/**
	 * @author winnie
	 */	
	public class AbsNavigation extends MovieClip
	{
		/**
		 * <br> 실제 버튼 클립을 삽입하기 위한 Dictionary. </br>
		 * <br> 뎁스별로 dicBtnClip[0], dicBtnClip[1] 등으로 삽입한다. </br>
		 * <br> ex ) dicBtnClip[0] = ExtendsAbsBtnClip 로, AbsBtnClip을 확장한 오브젝트여야 함 </br>
		 */		
		public var dicBtnClip : Dictionary = new Dictionary( true );
		
		/**
		 * super.xmlUrl 로 해당 url 셋팅이 선행 되어야 함. 
		 */		
		public var xmlUrl : String;
		
		/**
		 *  메인 버튼 리스트
		 */		
		public var btnList : Vector.<AbsBtnClip>;
		
		
		// xml 데이터 로더
		private var dataLoader : BUrlLoader;
		
		/**
		 * 모든 vo 리스트  ( 순차적으로 되어있음 )
		 */		
		public var allVOList : Vector.<BtnVO>;
		
		
		/**
		 * layout  
		 */		
		public var layout : INaviLayout;
		
		
		
		/**
		 * AbsNavigation
		 */		
		public function AbsNavigation()
		{
			super();
		}
		
		
		/**
		 * init
		 */		
		public function init():void
		{
			this.dataLoader = new BUrlLoader( xmlUrl, onXmlLoadComplete );
		}
		
		/**
		 * destory
		 */		
		public function destory():void
		{
			
		}
		
		/**
		 * onXmlLoadComplete
		 */		
		protected function onXmlLoadComplete():void
		{
			allVOList = new Vector.<BtnVO>();
			createMainBtn( XML( this.dataLoader.loadData ) );
		}
		
		
		/**
		 * 버튼 만들기 시작.
		 * @param data 메인 버튼이 가져야 할 xml 노드
		 */		
		protected function createMainBtn( data:XML ):void
		{
			btnList = new Vector.<AbsBtnClip>();
			
			var len:int = data.menu.length();
			for (var i:int = 0; i < len; i++) 
			{
				var vo : BtnVO = new BtnVO();
				vo.index = [i];
				vo.label = data.menu[i].@label;
				vo.url = data.menu[i].@link;
				vo.target = data.menu[i].@target;
				
				var btn : AbsBtnClip;
				if( dicBtnClip[ 0 ] != null ) btn = new dicBtnClip[ 0 ]();
				else btn = new AbsBtnClip();
				btn.vo = vo;
				
				btnList.push( btn );
				allVOList.push( vo );
				setNaviURL( vo );
				createSubBtn( btn, data.menu[i] );
			}
			
			MicroEventObserver.instance.dispatchEvent( new MicroEvent( EventType.NAVI_DATA_SET_COMPLETE ) );
			MicroEventObserver.executeListener( EventType.NAVI_DATA_SET_COMPLETE );
			initLayout();
		}
		
		
		
		/**
		 * 서브 버튼 제작 메서드 - factorial 로 무한뎁스 구현
		 * @param btn : 상위 버튼
		 * @param data : 상위 버튼이 가지고 있는 자식 xml 노드
		 */		
		protected function createSubBtn( btn:AbsBtnClip, data:XML ):void
		{
			if( data.menu[0] == null ) return;
			
			var subBtnList : Vector.<AbsBtnClip> = new Vector.<AbsBtnClip>();
			var thisDepth : int = btn.vo.index.length;
			var voList : Vector.<BtnVO> = new Vector.<BtnVO>();
			var len:int = data.menu.length();
			for (var i:int = 0; i < len; i++) 
			{
				var vo : BtnVO = new BtnVO();
				vo.index = btn.vo.index.concat( [i] );
				vo.label = data.menu[i].@label;
				vo.url = data.menu[i].@link;
				vo.target = data.menu[i].@target;
				
				var subBtn : AbsBtnClip;
				if( dicBtnClip[ thisDepth ] != null ) subBtn = new dicBtnClip[ thisDepth ]();
				else subBtn = new AbsBtnClip();
				subBtn.vo = vo;
				
				voList.push( vo );
				subBtnList.push( subBtn );
				allVOList.push( vo );
				setNaviURL( vo );
				createSubBtn( subBtn, data.menu[i] );
			}
			
			btn.vo.childVOList = voList;
			btn.subBtnList = subBtnList;
		}
		
		
		private function setNaviURL( vo:BtnVO ):void
		{
			var _type:String;
			var len:int = ContentsTypeManager.pageList.length;
			for (var i:int = 0; i < len; i++) 
			{
				if( StringUtils.similarity(ContentsTypeManager.pageList[i].menuName.toLowerCase(),vo.label.toLowerCase() ) == 100 )
				{
					_type = ContentsTypeManager.pageList[i].menuName;
//					URLManager.setUrl( _type, vo.url );
					break;
				}
			}
			
		}
		
		
		
		//-----------------------------------------------------------------------------------
		//
		// 네비게이션 레이아웃 설정. VERTICAL MODE , HORIZONTAL MODE , DOWN FALL MODE 등.
		//
		//-----------------------------------------------------------------------------------
		
		
		
		
		/**
		 * 네비 데이터 셋팅이 완료된 후 실제 설정하는 부분.
		 */		
		protected function initLayout():void
		{
//			var len:int = allVOList.length;
//			for (var i:int = 0; i < len; i++) 
//			{
//				trace( allVOList[i].index );
//			}
		}
		
		
		
		
		
		
		
		
		
		
		
		
		//-----------------------------------------------------------------------------------
		//
		// 버튼 클립 설정
		//
		//-----------------------------------------------------------------------------------
		
		/**
		 * 
		 * @param depth : 해당 뎁스 설정
		 * @param _class : AbsBtnClip 을 확장한 클래스
		 * 
		 */		
		public function setBtnClip( depth:int, _class:Class ):void
		{
			this.dicBtnClip[ depth ] = _class;
		}
		
		/**
		 * @return 현재 선택되어있는 vo 반환 
		 */		
		public function get selectedVo():BtnVO
		{
			var _vo : BtnVO;
			var len:int = allVOList.length;
			for (var i:int = 0; i < len; i++) 
			{
				if( layout.selectedIndex.toString() == allVOList[i].index.toString() )
				{
					_vo = allVOList[i];
					break;
				}
			}
			
			return _vo;
		}
	}
}








